#coding=utf-8
import sys
import time
import tkinter.messagebox

import pygame

pygame.init()
# 使用pygame之前必须初始化

LENGTH = 1000  # 主屏窗口长度
WIDTH = 680  # 主屏窗口宽度
screen = pygame.display.set_mode((LENGTH, WIDTH))  # 设置主屏窗口
screen2 = pygame.display.set_mode((LENGTH, WIDTH))  # 设置主屏窗口
# 说明：set_mode()可以短时间显示主屏窗口
pygame.display.set_caption("图片移动优化测试")  # 设置窗口标题
# 说明：若不设置窗口标题，则窗口标题默认为“pygame window”
class 血条:
    def __init__(self,人物,color='Red'):
        self.color=color               #改成Blue就是蓝条了
        self.length=人物.血量
    def 刷新(self,人物蓝量或血量,x,y):
        if 人物蓝量或血量<0:
            length=0
        else:
            length=人物蓝量或血量
        self.血条1 = pygame.Surface((length, 50))
        self.血条1.fill(self.color)
        screen.blit(self.血条1, (x, y))


class 一颗子弹:
    def __init__(self,使用人物,伤害=10):
        self.图片=pygame.image.load("游戏图片/篮球.png")
        self.图片=pygame.transform.scale(self.图片,(30,10))
        self.x=使用人物.rect.x
        self.y=使用人物.rect.y
        self.到达终点=0
        self.伤害=伤害
    def 打出(self):
        if self.x<=LENGTH-60:
            self.x += 8
            screen.blit(self.图片, (self.x, self.y))  # 传送
        else:
            self.到达终点=1
class 子弹集合:
    def __init__(self):
        self.lst=[]
    def add(self,使用人物,需蓝量=5):
        if 使用人物.蓝量-需蓝量>=0:
            a=一颗子弹(使用人物)
            self.lst.append(a)
            使用人物.蓝量-=需蓝量
    def 刷新(self,怪物):
        t=0
        for _ in self.lst:
            _.打出()
            if _.到达终点==1:
                self.lst.remove(self.lst[t])
            if 怪物!=None and 怪物.rect.x<_.x and _.x<怪物.rect.x+怪物.宽度:
                if 怪物.rect.y<_.y and _.y<怪物.rect.y+怪物.高度:
                    self.lst.remove(self.lst[t])
                    # tkinter.messagebox.showinfo("提示","命中")
                    怪物.血量-=_.伤害

            t+=1

class people:
    def __init__(self,pic_path,startx=500,starty=340):
        self.血量=100
        self.蓝量=100
        self.地面高度=340
        self.宽度=50
        self.高度=50
        self.img = pygame.image.load(pic_path)  # 加载本地图片
        self.img = pygame.transform.scale(self.img, (self.宽度, self.高度))  # 缩放
        self.rect = self.img.get_rect()  # 获取图片区域
        self.rect.x = startx  # 设置显示位置
        self.rect.y = starty  # 设置显示位置

        self.stopleft = True  # 图片移动开关
        self.stopright=True
        self.stopup=True
        self.stopdown=True

        self.speed = 5  # 移动速度
        self.jumpbool = False
        self.jumpt = 0
        self.起跳瞬间y=0     #这个变量必须只有点击跳跃那一下初始化，其它时候都不变

    def leftmove(self):
        self.rect.left -= self.speed
    def rightmove(self):
        self.rect.left += self.speed
    def upmove(self):
        pass
        self.rect.top -= self.speed
    def downmove(self):
        pass
        self.rect.top += self.speed
    def jump_init(self):
        if self.jumpbool==False:
            self.起跳瞬间y=self.rect.y
        kyle.jumpbool = True

    def jump(self):
        v0=15
        g=1
        self.jumpt+=1
        v=v0-g*self.jumpt
        self.rect.y-=v
        if self.rect.y>=self.起跳瞬间y:
            self.rect.y=self.起跳瞬间y    #这样就可以防止“下坠”现象的出现
            self.jumpt=0
            self.jumpbool=False
class 怪物(people):
    def __init__(self,pic_path):
        super().__init__(pic_path)
    def 重置大小(self,宽度,高度):
        self.宽度=宽度
        self.高度=高度
        self.img = pygame.transform.scale(self.img, (self.宽度, self.高度))  # 缩放
        self.rect.y-=abs(self.高度-50)        #50是原本人物的高度，这样用意是让怪物和人在同一水平面
#---------------------------------类实例化区-------------------------------------------------------
子弹=子弹集合()
kyle=people("游戏图片/柯南.png",startx=200)
怪物1=怪物("游戏图片/怪兽.png")
怪物1.重置大小(100,120)
人物血条=血条(kyle)
人物蓝条=血条(kyle,color='Blue')
怪物血条=血条(怪物1)
def GetEvent():  # 获取事件函数,循环内判断

    for event in pygame.event.get():  # 循环获取事件并监听事件状态

        if event.type == pygame.KEYDOWN:  # 按下了按键
            if event.key == pygame.K_UP:  # 上
                kyle.stopup = False
                kyle.direction = 'U'

            elif event.key == pygame.K_DOWN:  # 下
                kyle.stopdown = False
                kyle.direction = 'D'
            elif event.key == pygame.K_LEFT:  # 左
                kyle.stopleft = False
                kyle.direction = 'L'
            elif event.key == pygame.K_RIGHT:  # 右
                kyle.stopright = False
                kyle.direction = 'R'
            elif event.key == pygame.K_SPACE:
                kyle.jump_init()

        elif event.type == pygame.KEYUP:  # 松开了按键
            if event.key == pygame.K_UP:
                kyle.stopup=True
            elif event.key==pygame.K_DOWN:
                kyle.stopdown=True
            elif event.key==pygame.K_LEFT:
                kyle.stopleft=True
            elif event.key==pygame.K_RIGHT:
                kyle.stopright=True
            elif event.key == pygame.K_KP4:
                子弹.add(kyle)
        elif event.type == pygame.QUIT:  # 点击了关闭按钮
            pygame.quit()  # 卸载模块
            sys.exit()  # 退出程序


while True:
    # 说明：while True循环可以使得主屏窗口得以保留
    time.sleep(0.02)  # 使得循环速度变慢，从而使得图片移动速度变慢
    screen.fill((0, 0, 0))  # 填充
    GetEvent()  # 获取事件
    子弹.刷新(怪物1)
    人物血条.刷新(kyle.血量,0,0)
    人物蓝条.刷新(kyle.蓝量,0,50)
    怪物血条.刷新(怪物1.血量,500,0)
    if not kyle.stopleft:
        kyle.leftmove()         #图片移动
    if not kyle.stopright:
        kyle.rightmove()         #图片移动
    if not kyle.stopup:
        kyle.upmove()         #图片移动
    if not kyle.stopdown:
        kyle.downmove()         #图片移动
    if  kyle.jumpbool:
        kyle.jump()                       #这里不要传入跳跃点击瞬间的y，不然会空中连跳
    screen.blit(kyle.img, kyle.rect)  # 传送
    screen.blit(怪物1.img, 怪物1.rect)  # 传送

    pygame.display.update()  # 更新

